iT邦幫忙

2024 iThome 鐵人賽

DAY 9
0
Odoo

Odoo 部署策略系列 第 9

為 odoo 建立 Nginx 反向代理第二步:nginx.conf 設定實作

  • 分享至 

  • xImage
  •  

不多廢話,今天是 nginx.conf 的設定內容,大部分的全域設定是參考網路上常見的範例,我目前還沒有進行微調,主要的重點是 resolver 127.0.0.11server{} 中的內容。更多細節可以參考 nginx 反向代理官方文件

nginx
http {
    sendfile on;  # 啟用 sendfile,提升文件傳輸效能
    tcp_nopush on;  # 延遲發送部分封包,提升效能
    tcp_nodelay on;  # 禁用 Nagle 演算法,減少延遲
    keepalive_timeout 65;  # 保持連線的時間設定為 65 秒
    types_hash_max_size 2048;  # 調整 MIME 類型雜湊表的大小,以容納更多類型

    include /etc/nginx/mime.types;  # 包含預設的 MIME 類型設定
    default_type application/octet-stream;  # 設定預設的 MIME 類型

    # 記錄檔設定
    access_log /var/log/nginx/access.log;  # 存取記錄
    error_log /var/log/nginx/error.log;  # 錯誤記錄

    # Gzip 壓縮設定
    gzip on;  # 啟用 Gzip 壓縮
    gzip_disable "msie6";  # 禁用對 IE6 的 Gzip 支援

    # SSL 設定
    ssl_protocols TLSv1.2 TLSv1.3;  # 啟用 TLS 1.2 和 1.3 協議
    ssl_prefer_server_ciphers on;  # 優先使用伺服器端的加密套件

    resolver 127.0.0.11 valid=30s;  # 設定 Docker 內部的 DNS (還記得上一篇的網路架構圖嗎?),並設置解析結果的有效期為 30 秒

    # 將 HTTP 請求重新導向到 HTTPS
    server {
        listen 80 default_server;  # 監聽 HTTP 80 埠,作為預設伺服器
        listen [::]:80 default_server;  # 監聽 IPv6 的 HTTP 80 埠
        server_name _;  # 匹配所有網域名稱
        return 301 https://$host$request_uri;  # 將所有請求重新導向到 HTTPS
    }

    # 針對 Odoo 開發環境的反向代理設定
    server {
        listen 443 ssl;  # 監聽 HTTPS 443 埠並啟用 SSL
        server_name odoo-dev.internal.example.com odoo-dev.internal.example.local;  # 針對這兩個內部網域提供服務

        ssl_certificate /etc/nginx/certs/odoo_Certificate.crt;  # 設定 SSL 憑證
        ssl_certificate_key /etc/nginx/certs/odoo_Certificate.key;  # 設定 SSL 私鑰

        location / {
            proxy_set_header X-Client-Domain "internal";  # 設定自訂標頭,標示這是內部請求
            set $upstream odoo-dev:8069;  # 定義 upstream 變數,指向 Odoo 容器的 8069 埠
            proxy_pass http://$upstream;  # 將請求轉發到 Odoo 容器
            proxy_set_header Host $host;  # 傳遞原始的 Host 標頭
            proxy_set_header X-Real-IP $remote_addr;  # 傳遞原始客戶端的 IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 傳遞 X-Forwarded-For 標頭
            proxy_set_header X-Forwarded-Proto $scheme;  # 傳遞 X-Forwarded-Proto 標頭,標示原始協議

            # 處理上游伺服器錯誤的設定
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            proxy_connect_timeout 1s;  # 設定連接超時為 1 秒
            proxy_read_timeout 1s;  # 設定讀取超時為 1 秒
            proxy_send_timeout 1s;  # 設定傳送超時為 1 秒
            proxy_intercept_errors on;  # 啟用錯誤攔截,當上游伺服器回傳錯誤時自動顯示錯誤頁面
        }

        # 設定允許的 IP 範圍
        allow 10.0.0.0/8;  # 允許來自 10.0.0.0/8 的內部網段
        allow 172.16.0.0/12;  # 允許來自 172.16.0.0/12 的內部網段
        allow 192.168.0.0/16;  # 允許來自 192.168.0.0/16 的內部網段
        deny all;  # 拒絕所有其他 IP 的存取
    }
}

這裡有幾個要點需要注意:

  1. resolver 127.0.0.11:我不是像大部分教學那樣直接使用 proxy_pass http://odoo-dev:8069;,因為這個反向代理同時處理至少三個 Web 服務(例如 odoo-devodoo-prodpgAdmin)。如果其中一個服務的容器未啟動,Nginx 會無法啟動並直接報錯。使用 Docker 預設的 DNS(127.0.0.11)並將 upstream 設成變數,可以讓 Nginx 在發生內部連接問題時,先超時後再回傳 500 錯誤,而不至於整個 Nginx 無法啟動。

  2. 網域名稱設計:我們需要兩個網域的設定(odoo-dev.internal.example.comodoo-dev.internal.example.local)是因為 example.com 是正式環境的網域名稱,那我們怎麼在本機測試呢? example.local 就是用於同時模擬正式環境而且讓我們可以在開發的本機測試。透過這樣的設定,我可以將本機的請求轉發到 Nginx,並透過 Docker 的映射將請求轉發至 reverse-proxy。

hosts 設定

如果你要在本機測試 Odoo 的 WebApp-Deployment,可以透過 hosts 檔案設定,讓 example.local 網域指向本機:

  • Windows
    在管理者權限的 PowerShell 中執行以下指令,編輯 hosts 檔案:

    Start-Process notepad.exe "C:\Windows\System32\drivers\etc\hosts"
    

    然後在檔案中加入:

    127.0.0.1 odoo-dev.internal.example.local
    
  • Linux
    編輯 hosts 檔案:

    sudo vim /etc/hosts
    

    然後在檔案中加入:

    127.0.0.1 odoo-dev.internal.example.local
    

完成後,在瀏覽器輸入 odoo-dev.internal.example.local,它會解析到本機的 127.0.0.1,並最終轉發到 odoo-dev 上。

  1. ssl_certificate /etc/nginx/certs/odoo_Certificate.crt; # 設定 SSL 憑證
    ssl_certificate_key /etc/nginx/certs/odoo_Certificate.key; # 設定 SSL 私鑰

    這部分是 nginx 用來啟用 HTTPS 的關鍵設定,SSL 憑證和私鑰的路徑需要正確設定,以確保 nginx 能夠處理安全的 HTTPS 連接。下一章我們會介紹這些相關的名詞。


上一篇
從網路設計到 docker-compose:搭建 odoo 反向代理的第一步
下一篇
流量加密與反向代理第三步:介紹 HTTPS、CA 與 SSL 憑證
系列文
Odoo 部署策略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言